
#ifndef IA
#define IA
#include "all2.h"
#include "EPlateau.h"
//#include "saveur.h"
#include <vector>
#include <iostream>
#include <cstdlib>
#include <math.h>

//#include "dico/Dico2.h"
//#include "regles/regles.h"

#include "UCT/arbreUCT.h"
//#include "UCT/listeChaineeUCT.h"


#define POIDS_FORMES 2
#define POIDS_REGLES 1
#define POIDS_UCT 175

#define NB_THREAD 8
#define NB_DESCENTES 1000000

class Dico;
class regles;

using namespace std;


class Ia{

        public:

                Ia(EPlateau * ePla, int nombreThreads);
                void reinittable(vector<vector<int> > * table);
                Coup jouer ();
                void jouerEnBoucle(); //100000 descentes, joue, 100000 descentes...jusqu'a bloquer
                void afficherPoids();
                void affichetable(vector<vector<int> > * table);
                Dico * getDicoFormes();
                Dico * getDicoJoseki();
        void majpoids(vector<vector<int> > * table, int x, int y, vector<vector<int> > * tablePoids); //Rajoute au tableau des poids les valeur de table.
                char getCouleur();


    //UCT
    void threadLauncher();
    void trickRave(); // pour initialiser le veceur rave de maniere arbitraire.

        private:

        char couleur; // la couleur de l'IA
        vector<vector<int> > Poids ;  //les poids qui vont permettre de décider du coup a jouer
        EPlateau * p;
        Dico * dicoFormes;
        Dico * dicoJoseki;
        regles * mesRegles;
        int nbThread;

        //UCT
        int nbRepet;
    vector<arbreUCT *> arbres;
    vector <pthread_t> thread; //déclaration des threads
    vector<pthread_mutex_t> tableMutex; //tableau de mutex pour proteger les branches
    vector<pthread_mutex_t> Mutex; //tableau de mutex pour porteger les listes chainées, agrandissable. (0 pr listechaineeNoir lecture/ecriture, 1 pr listeChaineeBlanc lecture/ecriture, 2 pr listechaineeNoir lecture seul, 3 pr listeChaineeBlanc lecture suel)


    vector<vector <vecteurRave> > listeChainee;


    int poidsUCT;
    int poidsDicoFormes; //test

};



#endif
